﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;


/// <summary>
/// 正则匹配类
/// </summary>
 public static class Class_IsMatch
{
    #region 数字部分

    /// <summary>
    /// 验证是否数字（包含整数和小数)
    /// </summary>
    /// <param name="str">待验证字符串</param>
    /// <returns>返回bool类型值</returns>
    public static bool IsNumber(string str)
    {
        return Regex.IsMatch(str, @"^[-]?\d+[.]?\d*$");
    }
    /// <summary>
    /// 验证是否整数
    /// </summary>
    /// <param name="str">待验证字符串</param>
    /// <returns>返回bool类型值</returns>
    public static bool IsNum(string str)
    {
        return Regex.IsMatch(str, @"^[0-9]*$");
    }
    /// <summary>
    /// 至少n位数字
    /// </summary>
    /// <param name="str"></param>
    /// <param name="n"></param>
    /// <returns></returns>
    public static bool IsNum_n(string str,int n)
    {
        return Regex.IsMatch(str, @"^[0-9]{"+ n.ToString() +"}$");
    }
    /// <summary>
    /// 验证数字为m到n位之间的数字
    /// </summary>
    /// <param name="str"></param>
    /// /// <param name="m"></param>
    /// <param name="n"></param>
    /// <returns></returns>
    public static bool IsNum_mn(string str,int m, int n)
    {
        return Regex.IsMatch(str, @"^[0-9]{" + m.ToString()+","+ n.ToString() + "}$");
    }
    /// <summary>
    /// 正数、负数、和小数
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_ZHeng_Fu_XiaoSHu(string str)
    {
        return Regex.IsMatch(str, @"^(\-|\+)?\d+(\.\d+)?$");
    }
    /// <summary>
    /// 非零的正整数
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_ZHeng(string str)
    {
        return Regex.IsMatch(str, @"^[1-9]\d*$");
    }
    /// <summary>
    /// 非零的负整数
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_FuZHeng(string str)
    {
        return Regex.IsMatch(str, @"^\-[1-9][]0-9″*$");
    }
    /// <summary>
    /// 钱的输入格式：四种钱的表示形式我们可以接受:”10000.00″ 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_Money(string str)
    {
        return Regex.IsMatch(str, @"^[1-9][0-9]*$");
    }
    #endregion

    #region 日期时间部分
    /// <summary>
    /// 判断日期是否合法
    /// </summary>
    /// <param name="Date">输入YYYY-MM-DD格式</param>
    /// <returns></returns>
    public static bool IsDate(string Date)
    {
        //验证YYYY-MM-DD格式,基本上把闰年和2月等的情况都考虑进去
        bool bValid = Regex.IsMatch(Date, @"^((((1[6-9]|[2-9]\d)\d{2})-(0?[13578]|1[02])-(0?[1-9]|[12]\d|3[01]))|(((1[6-9]|[2-9]\d)\d{2})-(0?[13456789]|1[012])-(0?[1-9]|[12]\d|30))|(((1[6-9]|[2-9]\d)\d{2})-0?2-(0?[1-9]|1\d|2[0-8]))|(((1[6-9]|[2-9]\d)(0[48]|[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))-0?2-29-))$");
        return (bValid && Date.CompareTo("1753-01-01") >= 0);

        //将平年和闰年的日期验证表达式合并，我们得到最终的验证日期格式为YYYY-MM-DD的正则表达式为：

        //(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|
        //[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})-(((0[13578]|1[02])-
        //(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)-(0[1-9]|[12][0-9]|30))|
        //(02-(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|
        //[13579][26])|((0[48]|[2468][048]|[3579][26])00))-02-29)
    }
    #endregion

    #region 字符部分
    /// <summary>
    /// 英文和数字
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_En_Num(string str)
    {
        return Regex.IsMatch(str,@"^[A-Za-z0-9]+$");
    }
    /// <summary>
    /// 汉字
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_Chinese(string str)
    {
        return Regex.IsMatch(str, @"^[\u4e00-\u9fa5]{0,}$");
    }
    /// <summary>
    /// 由26个英文字母大写小写组成的字符串
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_26word(string str)
    {
        return Regex.IsMatch(str, @"^[A-Za-z]+$");
    }

  
    #endregion

    #region 网络部分
    /// <summary>
    /// 是否为ip
    /// </summary>
    /// <param name="ip"></param>
    /// <returns></returns>
    public static bool IsIP(string ip)
    {
        return Regex.IsMatch(ip, @"^（（2[0-4]\d|25[0-5]|[01]?\d\d?）\.）{3}（2[0-4]\d|25[0-5]|[01]?\d\d?）$");
    }
    /// <summary>
    /// 域名
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_Domain(string str)
    {
        return Regex.IsMatch(str, @"[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?");
    }
    /// <summary>
    /// InternetURL
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_URL(string str)
    {
        return Regex.IsMatch(str, @"[a-zA-z]+://[^\s]* 或 ^http://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$");
    }
    #endregion

    #region 杂项部分
    /// <summary>
    /// 验证电子邮件
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool IsEmail(string str)
    {
        return Regex.IsMatch(str, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
    }
    /// <summary>
    /// 手机号码
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_Mobile(string str)
    {
        return Regex.IsMatch(str, @"^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$");
    }
    /// <summary>
    /// 帐号是否合法(字母开头，允许4-16字节，允许字母数字下划线)
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_ID(string str)
    {
        return Regex.IsMatch(str, @"^[a-zA-Z][a-zA-Z0-9_]{3,15}$");
    }
    /// <summary>
    /// 密码(以字母开头，长度在4~18之间，只能包含字母、数字和下划线)
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_Password(string str)
    {
        return Regex.IsMatch(str, @"^[a-zA-Z]\w{3,17}$");
    }
    /// <summary>
    /// 强密码(必须包含大小写字母和数字的组合，不能使用特殊字符，长度在8-10之间)
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    public static bool Is_Password_plus(string str)
    {
        return Regex.IsMatch(str, @"^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$");
    }
    #endregion
}

